package pl.pw.gis.gc_sa.algo;

import java.util.HashSet;
import java.util.Set;

import pl.pw.gis.gc_sa.data.Graph;
import pl.pw.gis.gc_sa.data.VertexChange;

/**
 * Klasa dziedziczaca po Cost wykorzystywana do obliczania biezacego kosztu
 * kolorowania jako liczby kolorow uzytych do kolorowania
 * 
 * @author Lukasz
 * 
 */
public class CostAsColorCount extends Cost {

    CostAsColorCount(Graph graph, int[] solution) {
        super(graph, solution);
        mCost = colorCount(solution);
    }

    /**
     * Zwraca koszt kolorowania, po wprowadzenie zadanej zmiany
     * 
     * @param vc
     *            obiekt opisujacy zmiane
     * 
     * @return wyliczony koszt po zmianie
     */
    @Override
    public int costAfterChange(VertexChange change) {
        int[] colorsTab = mSolution.clone();
        colorsTab[change.getVertexId()] = change.getNewColor();
        return colorCount(colorsTab);
    }

    /**
     * Metoda odswieza pola klasy na podstawie wprowadzonych zmian oraz
     * aktualizuje biezaca wartosc kosztu
     * 
     * @param vc
     *            obiekt zawierajacy informacje o zmianach
     * @param newCost
     *            nowa biezaca wartosc kosztu
     */
    @Override
    public void applyChange(VertexChange change, int currentCost) {
        mSolution[change.getVertexId()] = change.getNewColor();
        mCost = currentCost;
    }

    /**
     * Zwraca liczbe roznych kolorow w tablicy tab
     * 
     */
    protected int colorCount(int[] tab) {

        Set<Integer> found = new HashSet<Integer>();
        for (int color : tab)
            found.add(color);

        return found.size();
    }

}
